//Transferencia.h

#ifndef TRANSFERENCIA_H_ 
#define TRANSFERENCIA_H_

#include <winsock.h>
#include <stdio.h>
#include <stdlib.h>

/*resultado de las funciones*/
#define RES_ERROR -1
#define RES_ERROR_CREACION_SOCKET -2
#define RES_ERROR_BINDING -3
#define RES_ERROR_LISTEN -4
#define RES_ERROR_ACCEPT_CONNECTION -5
#define RES_ERROR_CONNECT_TO_HOST -6
#define RES_ERROR_CLOSE_CONNECT -7
#define RES_ERROR_CONEXION_NOT_ACTIVE -8
#define RES_NO_CLOSE_AVAILABLE -9
#define RES_ERROR_SEND_DATA -10
#define RES_ERROR_RECV -11
#define RES_OK_CONNECTION_CLOSED -13
#define RES_NOT_VALID_COMMAND -15
#define RES_NOT_VALID_DATA -14
#define RES_QUIT_CLIENT -16
#define RES_QUIT -12
#define RES_OK 0
#define BACKLOG 5
#define SLEEPTIME 1000

typedef struct CONEXION{
	SOCKET socket;
}CONEXION;

enum tr_tipo_dato {td_int, td_char, td_float, td_double };

/*--------------------------------------------------------------------------------------------------------*/
    /*Escucha en un puerto por conexiones entrantes. devuelve RES_OK si alguien se conecto y pConexion apunta 
	a la nueva conexion. De lo contrario devuelve un codigo de error y pConexion permanece inalterado.
	*/
int trEscuchar(int Puerto, CONEXION *pConexion);
/*--------------------------------------------------------------------------------------------------------*/

/*--------------------------------------------------------------------------------------------------------*/
    /*Intenta conectarse a una direccion de internet y a un puerto de conexion especifico. si todo sale bien
	devuelve RES_OK y pConexion apunta a la nueva conexion. De lo contrario devuelve un codigo de error
	y pConexion permanece inalterado.
	*/
int trConectar(const char* pDireccion, int Puerto, CONEXION *pConexion);
/*--------------------------------------------------------------------------------------------------------*/

/*--------------------------------------------------------------------------------------------------------*/
	/* cierra una conexion previamente abierta. Si todo sale bien devuelve RES_OK de lo contrario devuelve 
	un codigo de error.
	*/
int trCerrarConexion (CONEXION *pConexion);
/*--------------------------------------------------------------------------------------------------------*/

/*--------------------------------------------------------------------------------------------------------*/
	/* verifica que una conexion este activa. Si resulta estarlo devuelve RES_OK de lo contrario devuelve
	un codigo de error
	*/
int trConexionActiva (CONEXION *pConexion);
/*--------------------------------------------------------------------------------------------------------*/
	/* envia atraves de la conexion una cantidad de datos de un tipo especificado de datos,Si todo sale bien
	devuelve RES_OK de lo contrario devuelve un codigo de error. 
	*/
int trEnviar (CONEXION *pConexion, enum tr_tipo_dato tipo, int cantItems, const void *datos);
/*--------------------------------------------------------------------------------------------------------*/

/*--------------------------------------------------------------------------------------------------------*/
	/* recibe atraves de la conexion una cantidad de datos de un tipo de datos especficados.Si todo sale bien
	devuelve RES_OK de lo contrario devuelve un codigo de error. 
	*/
int trRecibir (CONEXION *pConexion, enum tr_tipo_dato *tipo, int *cantItems, void *datos);
/*--------------------------------------------------------------------------------------------------------*/

/*--------------------------------------------------------------------------------------------------------*/
	/*copiar la direccion con la que se ha establecido la conexion en pIP.
	Si todo sale bien devuelve RES_OK de lo contrario devuelve un codigo de error.
	*/
int trIP (CONEXION *pConexion, char *pIP);
/*--------------------------------------------------------------------------------------------------------*/

/*--------------------------------------------------------------------------------------------------------*/
	/*copiar el puerto de comunicacion en pPuerto.
	 Si todo sale bien devuelve RES_OK de lo contrario devuelve un codigo de error.
	*/
int trPuerto (CONEXION *pConexion, int *pPuerto);
/*--------------------------------------------------------------------------------------------------------*/

#endif